home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / simula / compiler / cim / sun4del2.lha / libcim.a / simulation.sim < prev   
Text File  |  1992-08-23  |  7KB  |  276 lines

  1. % $Id: simulation.sim,v 1.1 1992/08/23 19:09:22 cim Exp $
  2. %ifdef included
  3. %else
  4. %timestamp simulation
  5. %endif
  6. % nameasvar on
  7. %nonetest off
  8. %define EXCH
  9. %cacesensitive on
  10. SIMSET CLASS SIMULATION;
  11. BEGIN
  12.   REF(PROCESS) zzsqs;
  13.  
  14.   REF(zzmain_program)MAIN;
  15.     
  16.   REF(PROCESS) PROCEDURE CURRENT; CURRENT:-zzsqs.zzsqssuc;
  17.  
  18. %IFDEF INTEGER_SIMULATION
  19.   INTEGER
  20. %ELSE
  21.   LONG REAL
  22. %ENDIF
  23.             PROCEDURE TIME; TIME:=zzsqs.zzsqssuc.zzevtime;
  24.  
  25.   LINK CLASS PROCESS;
  26.   BEGIN
  27.     ! From event notice: ;
  28.     REF(PROCESS) zzsqssuc, zzsqspred;
  29. %IFDEF INTEGER_SIMULATION
  30.     INTEGER
  31. %ELSE
  32.     LONG REAL
  33. %ENDIF
  34.               zzevtime;
  35.       
  36.     ! From old process: ;
  37.     BOOLEAN zzterminated_process;
  38.  
  39.     BOOLEAN PROCEDURE IDLE; IDLE:= (zzsqssuc==NONE);
  40.  
  41.     BOOLEAN PROCEDURE TERMINATED; TERMINATED:=zzterminated_process;
  42.     
  43. %IFDEF INTEGER_SIMULATION
  44.     INTEGER
  45. %ELSE
  46.     LONG REAL
  47. %ENDIF
  48.               PROCEDURE EVTIME;
  49.       IF  zzsqssuc==NONE THEN ERROR("No Evtime for idle process")
  50.       ELSE EVTIME:= zzevtime;
  51.       
  52.     REF(PROCESS) PROCEDURE NEXTEV;
  53.       NEXTEV:-IF zzsqssuc==NONE OR ELSE zzsqssuc==zzsqs THEN NONE
  54.         ELSE zzsqssuc;
  55.  
  56.     ! Not necessary: ;  zzsqssuc:- zzsqspred:- NONE;
  57.  
  58.     DETACH;
  59.     INNER;
  60.     zzterminated_process:=TRUE;
  61.  
  62.     ! Remove from SQS: ;
  63.     zzsqssuc.zzsqspred:- zzsqspred;
  64.     zzsqspred.zzsqssuc:- zzsqssuc;
  65.     zzsqspred:- zzsqssuc:- NONE;
  66.  
  67.     IF zzsqs.zzsqssuc==zzsqs THEN ERROR("SQS: Empty")
  68. %IFDEF EXCH
  69.                              ELSE EXCHANGE(THIS PROCESS, zzsqs.zzsqssuc);
  70. %ELSE
  71.                              ELSE RESUME(zzsqs.zzsqssuc);
  72. %ENDIF
  73.  
  74.     ERROR("SQS: Terminated process");
  75.   END PROCESS;
  76.   
  77.   PROCEDURE activat(REAC,X,CODE,T,Y,PRIO);
  78.     REF(PROCESS)X,Y;
  79.     BOOLEAN REAC,PRIO;
  80.     CHARACTER CODE;
  81. %IFDEF INTEGER_SIMULATION
  82.     INTEGER
  83. %ELSE
  84.     LONG REAL
  85. %ENDIF
  86.               T;
  87.   BEGIN
  88.     REF(PROCESS) b, cur; 
  89. %IFDEF INTEGER_SIMULATION
  90.     INTEGER
  91. %ELSE
  92.     LONG REAL
  93. %ENDIF
  94.               tm;
  95.  
  96.     IF X =/= NONE AND THEN NOT X.zzterminated_process
  97.        AND THEN (REAC OR ELSE X.zzsqssuc == NONE) THEN
  98.     BEGIN
  99.       cur:- zzsqs.zzsqssuc; tm:=cur.zzevtime;
  100.  
  101.       IF CODE = '!1!' THEN
  102.       BEGIN ! Direct ;
  103.          IF X==cur THEN GOTO exit;
  104.          T:=tm; b:- zzsqs;
  105.       END ELSE
  106.       IF CODE = '!2!' THEN
  107.       BEGIN !At;
  108.          IF T<=tm THEN
  109.          BEGIN IF PRIO AND THEN X==cur THEN GOTO exit ELSE T:=tm END;
  110.       END ELSE
  111.       IF CODE = '!3!' THEN
  112.       BEGIN !Delay;
  113.          T:= T+tm;
  114.          IF T<=tm THEN
  115.          BEGIN IF PRIO AND THEN X==cur THEN GOTO exit ELSE T:=tm END;
  116.       END ELSE
  117.       ! CODE = '!4!' OR CODE = '!5!' ;
  118.       BEGIN ! 4=Before, 5=After ;
  119.          IF Y==NONE OR ELSE Y.zzsqssuc==NONE THEN
  120.          BEGIN
  121.             IF X.zzsqssuc=/=NONE THEN
  122.             BEGIN
  123.               X.zzsqssuc.zzsqspred:- X.zzsqspred;
  124.               X.zzsqspred.zzsqssuc:- X.zzsqssuc;
  125.               X.zzsqspred:- NONE; X.zzsqssuc:- NONE;
  126.             END;
  127.  
  128.             IF zzsqs.zzsqssuc==zzsqs THEN ERROR("SQS: Empty");
  129.             GOTO exit;
  130.          END;
  131.  
  132.          IF X==Y THEN GOTO exit;
  133.  
  134.          T:= Y.zzevtime; 
  135.          
  136.          IF CODE = '!4!' THEN b:- Y.zzsqspred ELSE b:- Y;
  137.        END;
  138.  
  139.        IF X.zzsqssuc =/= NONE THEN
  140.        BEGIN
  141.            X.zzsqssuc.zzsqspred:- X.zzsqspred;
  142.            X.zzsqspred.zzsqssuc:- X.zzsqssuc;
  143.        END;
  144.  
  145.        IF b==NONE THEN
  146.        BEGIN ! Not `direct', `after' or `before' ;
  147.           b:- zzsqs.zzsqspred;
  148.           WHILE b.zzevtime>T DO b:- b.zzsqspred;
  149.           IF PRIO THEN
  150.             WHILE b.zzevtime=T DO b:- b.zzsqspred;
  151.        END;
  152.  
  153.        X.zzevtime:= T;
  154.        X.zzsqspred:- b; X.zzsqssuc:- b.zzsqssuc;
  155.        b.zzsqssuc:- X; X.zzsqssuc.zzsqspred:- X;
  156.  
  157. %IFDEF EXCH
  158.        IF zzsqs.zzsqssuc=/=cur THEN EXCHANGE(cur, zzsqs.zzsqssuc);
  159. %ELSE
  160.        IF zzsqs.zzsqssuc=/=cur THEN RESUME(zzsqs.zzsqssuc);
  161. %ENDIF
  162.     END;
  163.   exit:
  164.   END activat;
  165.  
  166.   PROCEDURE HOLD(t); 
  167. %IFDEF INTEGER_SIMULATION
  168.     INTEGER
  169. %ELSE
  170.     LONG REAL
  171. %ENDIF
  172.               t;
  173.   BEGIN
  174.     REF(PROCESS) p,q; p:- zzsqs.zzsqssuc;
  175.     IF t>0 THEN p.zzevtime:= p.zzevtime + t;
  176.     t:= p.zzevtime;  ! New evtime ;
  177.     IF p.zzsqssuc=/=zzsqs AND THEN p.zzsqssuc.zzevtime<=t THEN
  178.     BEGIN
  179.         p.zzsqssuc.zzsqspred:- p.zzsqspred;
  180.         p.zzsqspred.zzsqssuc:- p.zzsqssuc;
  181.  
  182.         q:- zzsqs.zzsqspred;
  183.         WHILE q.zzevtime>t DO q:- q.zzsqspred;
  184.  
  185.         p.zzsqspred:- q; p.zzsqssuc:- q.zzsqssuc;
  186.         q.zzsqssuc:- p; p.zzsqssuc.zzsqspred:- p;
  187.  
  188. %IFDEF EXCH
  189.         EXCHANGE(p, zzsqs.zzsqssuc); 
  190. %ELSE
  191.         RESUME(zzsqs.zzsqssuc);
  192. %ENDIF
  193.     END IF;
  194.   END HOLD;
  195.   
  196.   PROCEDURE PASSIVATE;
  197.   BEGIN
  198.      REF(PROCESS) p; p:- zzsqs.zzsqssuc;
  199.      p.zzsqssuc.zzsqspred:- p.zzsqspred;
  200.      p.zzsqspred.zzsqssuc:- p.zzsqssuc;
  201.      p.zzsqspred:- NONE; p.zzsqssuc:- NONE;
  202.  
  203.      IF zzsqs.zzsqssuc==zzsqs THEN ERROR("SQS: Empty")
  204. %IFDEF EXCH
  205.                               ELSE EXCHANGE(p, zzsqs.zzsqssuc);
  206. %ELSE
  207.                               ELSE RESUME(zzsqs.zzsqssuc);
  208. %ENDIF
  209.   END PASSIVATE;
  210.   
  211.   PROCEDURE WAIT(S);REF(HEAD)S;
  212.   BEGIN
  213.      REF(PROCESS) p; p:- zzsqs.zzsqssuc;
  214.      p.INTO(S); ! May also be expanded inline ;
  215.  
  216.      p.zzsqssuc.zzsqspred:- p.zzsqspred;
  217.      p.zzsqspred.zzsqssuc:- p.zzsqssuc;
  218.      p.zzsqspred:- NONE; p.zzsqssuc:- NONE;
  219.  
  220.      IF zzsqs.zzsqssuc==zzsqs THEN ERROR("SQS: Empty")
  221. %IFDEF EXCH
  222.                               ELSE EXCHANGE(p, zzsqs.zzsqssuc);
  223. %ELSE
  224.                               ELSE RESUME(zzsqs.zzsqssuc);
  225. %ENDIF
  226.   END WAIT;
  227.   
  228.   PROCEDURE CANCEL(x); REF(PROCESS)x;
  229.   BEGIN
  230.      REF(PROCESS) cur;
  231.      IF x=/=NONE AND THEN x.zzsqssuc=/=NONE THEN
  232.      BEGIN
  233.         cur:- zzsqs.zzsqssuc;
  234.         x.zzsqssuc.zzsqspred:- x.zzsqspred;
  235.         x.zzsqspred.zzsqssuc:- x.zzsqssuc;
  236.         x.zzsqspred:- NONE; x.zzsqssuc:- NONE;
  237.  
  238.         IF x==cur THEN
  239.         BEGIN
  240.            IF zzsqs.zzsqssuc==zzsqs THEN ERROR("SQS: Empty")
  241. %IFDEF EXCH
  242.                                     ELSE EXCHANGE(cur, zzsqs.zzsqssuc);
  243. %ELSE
  244.                                     ELSE RESUME(zzsqs.zzsqssuc);
  245. %ENDIF
  246.         END;
  247.      END;
  248.   END CANCEL;
  249.   
  250.   PROCESS CLASS zzmain_program;
  251.   BEGIN
  252.     WHILE TRUE DO DETACH
  253.   END MAIN_PROGRAM;
  254.  
  255.   PROCEDURE ACCUM(A,B,C,D);NAME A,B,C; 
  256. %IFDEF INTEGER_SIMULATION
  257.     INTEGER
  258. %ELSE
  259.     LONG REAL
  260. %ENDIF
  261.               A,B,C,D;
  262.   BEGIN
  263.     A:=A+C*(TIME-B); B:=TIME; C:=C+D;
  264.   END ACCUM;
  265.     
  266.   zzsqs:- NEW PROCESS; zzsqs.zzevtime:= -1;
  267.  
  268.   MAIN:- NEW zzmain_program;
  269.   zzsqs.zzsqssuc:- MAIN; zzsqs.zzsqspred:- MAIN;
  270.   MAIN.zzsqssuc:- zzsqs; MAIN.zzsqspred:- zzsqs;
  271.  
  272. END SIMULATION;
  273.  
  274. %CACESENSITIVE OFF
  275. %eof
  276.